/**
 * 文件名称:  JdbcDaoImpl.java
 * 文件序号:  序号
 * 内容描述:  文件简单描述，多行换行书写
 * 版权声明:  山东鸿蝶信息技术有限公司
 * 创建用户:  zhangkai
 * 创建日期:  2016/12/20 20:56
 * 修改用户:  无
 * 修改日期:  无
 * 修改说明:  无
 * 文件版本:  V1.0
 * 文件路径:
 */

package com.hongdee.common.dao.impl;


import com.hongdee.common.Constant;
import com.hongdee.common.dao.IJdbcDao;
import com.mysql.jdbc.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 名  称:JdbcDaoImpl
 * 类  型: class
 * 描  述: 用一句话描述类的作用
 * 路  径:com.hongdee.dao
 * 作  者:zhangkai
 * 日  期:2016/12/20 20:56
 */
@Service
public class JdbcDaoImpl implements IJdbcDao {
    @Autowired
    @Qualifier("jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    /**
     * 方法名称: queryForMapBySql
     * 方法描述: 根据 sql 语句返回单条记录，并转为 Map 类型
     * 参数说明: String sql
     * 返回内容: Map<String,Object> 返回记录的Map 型式
     * 异常说明: Exception
     * 创建用户:
     * 创建时间:
     * 修改用户:
     * 修改时间:
     * 修改内容:
     */
    @Override
    public Map<String, Object> queryForMapBySql(String sqlStr) throws Exception {
        Map<String, Object> m;
        try {
            m = this.jdbcTemplate.queryForMap(sqlStr);
        } catch (EmptyResultDataAccessException e) {
            return new HashMap();
        }
        return m;
    }

    public Map<String, Object> queryForMapOfNull(String sqlStr, Object... params) throws Exception {
        Map<String, Object> m;
        try {
            m = this.jdbcTemplate.queryForMap(sqlStr, params);
        } catch (EmptyResultDataAccessException e) {
            return new HashMap();
        }
        return m;
    }

    /**
     * 方法名称: queryForMapBySqlWithParams
     * 方法描述: 根据 sql ，参数查询 语句返回单条记录，并转为 Map 类型
     * 参数说明: String sql
     * 参数说明: Object ...params,查询参数数组，需与 sql 语句中的占位符一一对应
     * 返回内容: Map<String,Object> 返回记录的Map 型式
     * 异常说明: Exception
     * 创建用户:
     * 创建时间:
     * 修改用户:
     * 修改时间:
     * 修改内容:
     */
    @Override
    public Map<String, Object> queryForMapBySqlWithParams(String sqlStr, Object... params) throws Exception {
        Map<String, Object> m;
        try {
            m = this.jdbcTemplate.queryForMap(sqlStr, params);
        } catch (EmptyResultDataAccessException e) {
            return new HashMap();
        }
        return m;
    }

    /**
     * 方法名称: queryForMapListBySql
     * 方法描述: 根据 sql 语句返回记录的 Map集合
     * 参数说明: String sql
     * 返回内容: List<Map<String,Object>> 返回记录的Map集合
     * 异常说明: Exception
     * 创建用户:
     * 创建时间:
     * 修改用户:
     * 修改时间:
     * 修改内容:
     */
    @Override
    public List<Map<String, Object>> queryForMapListBySql(String sqlStr) throws Exception {
        return this.jdbcTemplate.queryForList(sqlStr);
    }

    /**
     * 方法名称: queryForMapListBySqlWithParams
     * 方法描述: 根据 sql ，参数查询 语句返回记录的 map 集合
     * 参数说明: String sql
     * 参数说明: Object ...params,查询参数数组，需与 sql 语句中的占位符一一对应
     * 返回内容: List<Map<String,Object>> 返回记录的Map 型式的集合
     * 异常说明: Exception
     * 创建用户:
     * 创建时间:
     * 修改用户:
     * 修改时间:
     * 修改内容:
     */
    @Override
    public List<Map<String, Object>> queryForMapListBySqlWithParams(String sqlStr, Object... param) throws Exception {
        return this.jdbcTemplate.queryForList(sqlStr, param);
    }

    /**
     * 方法名称:queryForPageMap
     * 方法描述:  Jdbc 分页查询，此处支持 Mysql，后期重构时，能过工厂方法支持多数据库
     * 返回内容:
     * 异常说明:
     * 创建用户:
     * 创建时间:
     * 修改用户:
     * 修改时间:
     * 修改内容:
     */
    public Map<String, Object> queryForPageMap(String start, String limit, String sql, Object... params) throws Exception {
        //默认分页起始行，为空或 Null，或者不可转为数字时
        if (StringUtils.isNullOrEmpty(start) || !StringUtils.isStrictlyNumeric(start)) {
            start = "0";
        }
        //默认分页大小，为空或 Null，或者不可转为数字时
        if (StringUtils.isNullOrEmpty(limit) || !StringUtils.isStrictlyNumeric(limit)) {
            limit = "50";
        }
        if (StringUtils.isNullOrEmpty(sql)) {
            throw new Exception("SQL语句不能为空！");
        }
        //截取 FROM 之后的语句，用于计算记录总数
        String fromSQL = sql.substring(sql.toUpperCase().indexOf(" FROM "));
        //查询记录总数
        Map<String, Object> countMap;
        try {
           countMap = this.jdbcTemplate.queryForMap(Constant.COUNT_PRE + fromSQL, params);
        }catch (DataAccessException e){
            System.out.print(e);
            countMap = new HashMap();
            countMap.put("COUNT",0);
        }
        String total = String.valueOf(countMap.get("COUNT"));
        //查询实际分页数据
        String pageSQL = Constant.PAGE_SQL.replace("{limit}", limit).replace("{start}", start);
        List resList = this.jdbcTemplate.queryForList(sql + pageSQL, params);
        Map resMap = new HashMap();
        resMap.put("total", total);
        resMap.put("dataList", resList);
        return resMap;
    }

    /**
     * 更新 SQL 语句
     *
     * @param sql
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public int update(String sql, Object... params) throws Exception {
        if (StringUtils.isNullOrEmpty(sql)) {
            throw new Exception("无效的 SQL语句");
        }
        return this.jdbcTemplate.update(sql, params);
    }
}
